/*
 * 文件名称：AppTimer.h
 * 文件描述: 提供消息队列存储，实现消息缓存功能
 * 作者信息：Satan-Emperor
 * 版本信息：V1.0.0
 * 修改历史：2014-04-22
 */

#include "MsgQueue.h"
#include "debugLog.h"

#include <stdio.h>

/*
 * 函数名称：MsgQueue
 * 函数描述：构造MsgQueue，初始化队列内容
 * 输入参数：无
 * 输出参数：无
 * 其他说明：delete[]相当于回收数组
 */
MsgQueue::MsgQueue(void)
{
    pthread_mutex_init(&mMsgQueueMutex, NULL);

    while (!mMsgQueue.empty())
    {
        char *pMsgBuff = mMsgQueue.front();
        if (pMsgBuff != NULL)
            delete[] pMsgBuff;
        mMsgQueue.pop();
    }
}

/*
 * 函数名称：~MsgQueue
 * 函数描述：析构MsgQueue，仅仅销毁队列互斥锁
 * 输入参数：无
 * 输出参数：无
 * 其他说明：
 */
MsgQueue::~MsgQueue(void)
{
    pthread_mutex_destroy( &mMsgQueueMutex );
}

/*
 * 函数名称：pushMsg
 * 函数描述：向消息队列中压入消息
 * 输入参数：1.pMsgBuffAddr：消息缓存地址
 * 输出参数：1.结果返回值，0为正确，-1为错误
 * 其他说明：队列只存储消息的地址
 */
int MsgQueue::pushMsg(char *pMsgBuffAddr)
{
    if (pMsgBuffAddr == NULL)
    {
        return -1;
    }

    if (pthread_mutex_lock(&mMsgQueueMutex) != 0)
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_lock fail!");

        goto END;
    }

    mMsgQueue.push(pMsgBuffAddr); //Just put the message buffer addr to queue

END:
    if (pthread_mutex_unlock(&mMsgQueueMutex) != 0)
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_unlock fail!");
        return -1;
    }
    else
    {
        return 0;
    }
}

/*
 * 函数名称：popMsg
 * 函数描述：从消息队列中弹出消息
 * 输入参数：1.ppMsgBuffAddr：消息队列地址的双重指针
 * 输出参数：1.结果返回值，0为正确，-1为错误
 * 其他说明：从队列的首部弹出，front只返回不移除，pop只移除不返回
 */
int MsgQueue::popMsg(char **ppMsgBuffAddr)
{
    if (ppMsgBuffAddr == NULL)
    {
        return -1;
    }

    int ret = -1;

    if (pthread_mutex_lock(&mMsgQueueMutex) != 0)
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_lock fail!");
        ret = -1;
        goto END;
    }

    if (!mMsgQueue.empty())
    {
        *ppMsgBuffAddr = mMsgQueue.front();
        mMsgQueue.pop();
        ret = 0;
    }
    else
    {
        ret = -1;
    }

END:
    if (pthread_mutex_unlock(&mMsgQueueMutex) != 0)
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_unlock fail!");
        return -1;
    }
    else
    {
        return ret;
    }
}

/*
 * 函数名称：getMsg
 * 函数描述：获取消息队列中的消息，外部函数
 * 输入参数：1.ppMsgBuff：消息队列地址的双重指针
 * 输出参数：1.结果返回值，0为正确，-1为错误
 * 其他说明：调用受保护的成员函数
 */
int MsgQueue::getMsg(char **ppMsgBuff)
{
    return popMsg( ppMsgBuff );
}

/*
 * 函数名称：clearMsgQueue
 * 函数描述：清空消息队列中的消息
 * 输入参数：1.ppMsgBuff：消息队列地址的双重指针
 * 输出参数：1.结果返回值，0为正确，-1为错误
 * 其他说明：
 */
int MsgQueue::clearMsgQueue(void)
{
    int ret = -1;

    if (pthread_mutex_lock(&mMsgQueueMutex) != 0)
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_lock fail!");
        ret = -1;
        goto END;
    }

    if (mMsgQueue.empty())
    {
        ret = -1;
        goto END;
    }
    else
    {
        while (!mMsgQueue.empty())
        {
            char *pMsgBuff = mMsgQueue.front();
            if (pMsgBuff != NULL)
                delete[] pMsgBuff;
            mMsgQueue.pop();
        }

        ret = 0;
        goto END;
    }

END:
    if (pthread_mutex_unlock(&mMsgQueueMutex) != 0)
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_unlock fail!");
        return -1;
    }
    else
    {
        return ret;
    }
}

/*
 * 函数名称：getSize
 * 函数描述：获取消息队列中的消息个数
 * 输入参数：无
 * 输出参数：1.结果返回值，-1为错误,其他为消息个数
 * 其他说明：
 */
int MsgQueue::getSize(void)
{
    int ret = 0;

    if( pthread_mutex_lock(&mMsgQueueMutex) != 0 )
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_lock fail!");
        ret = -1;
        goto END;
    }

    ret = mMsgQueue.size();

END:
    if (pthread_mutex_unlock(&mMsgQueueMutex) != 0)
    {
        DEBUG_ERROR(COMMON_LIB, "pthread_mutex_unlock fail!");
        return -1;
    }
    else
    {
        return ret;
    }
}

//EOF
